package com.lkd.http.controller;

import com.lkd.entity.TaskEntity;
import com.lkd.entity.TaskStatusTypeEntity;
import com.lkd.http.vo.CancelTaskViewModel;
import com.lkd.http.vo.TaskViewModel;
import com.lkd.service.TaskService;
import com.lkd.service.TaskStatusTypeService;
import com.lkd.vo.Pager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.security.auth.login.LoginException;
import java.util.List;

@RestController
@RequestMapping("/task")
public class TaskController extends BaseController {
    @Autowired
    private TaskService taskService;

    @Resource
    private TaskStatusTypeService taskstatustypeService;


    /**
     * 搜索工单
     *
     * @param pageIndex
     * @param pageSize
     * @param innerCode 设备编号
     * @param userId    工单所属人Id
     * @param taskCode  工单编号
     * @param status    工单状态
     * @param isRepair  是否是维修工单
     * @return
     */
    @GetMapping("/search")
    public Pager<TaskEntity> search(
            @RequestParam(value = "pageIndex", required = false, defaultValue = "1") Long pageIndex,
            @RequestParam(value = "pageSize", required = false, defaultValue = "10") Long pageSize,
            @RequestParam(value = "innerCode", required = false, defaultValue = "") String innerCode,
            @RequestParam(value = "userId", required = false, defaultValue = "") Integer userId,
            @RequestParam(value = "taskCode", required = false, defaultValue = "") String taskCode,
            @RequestParam(value = "status", required = false, defaultValue = "") Integer status,
            @RequestParam(value = "isRepair", required = false, defaultValue = "") Boolean isRepair,
            @RequestParam(value = "start", required = false, defaultValue = "") String start,
            @RequestParam(value = "end", required = false, defaultValue = "") String end) {
        return taskService.search(pageIndex, pageSize, innerCode, userId, taskCode, status, isRepair, start, end);
    }

    /**
     * 创建工单
     *
     * @param taskViewModel
     * @return
     */
    @PostMapping(path = "/create")
    public Boolean create(@RequestBody TaskViewModel taskViewModel) {

        taskViewModel.setAssignorId(getUserId());

        return taskService.create(taskViewModel);
    }


    /**
     * 接收工单
     *
     * @param taskId
     * @return
     */
    @GetMapping("/accept/{taskId}")
    public Boolean accept(@PathVariable String taskId) throws LoginException {

        Long id = Long.valueOf(taskId);
        TaskEntity task = taskService.getById(id);
        if (task.getUserId().intValue() != getUserId().intValue()) {
            throw new LoginException("非法操作");
        }
        return taskService.accept(id);
    }


    /**
     * 取消工单
     *
     * @param taskId
     * @param viewModel
     * @return
     * @throws LoginException
     */
    @PostMapping("/cancel/{taskId}")
    public Boolean cancel(@PathVariable String taskId, @RequestBody CancelTaskViewModel viewModel) throws LoginException {

        Long id = Long.valueOf(taskId);
        TaskEntity task = taskService.getById(id);

        if (task.getUserId().intValue() != getUserId().intValue()) {
            throw new LoginException("非法操作");
        }
        return taskService.cancelTask(id, viewModel);
    }


    /**
     * 完成工单
     *
     * @param taskId
     * @return
     * @throws LoginException
     */
    @GetMapping("/complete/{taskId}")
    public Boolean complete(@PathVariable String taskId) throws LoginException {

        Long id = Long.valueOf(taskId);
        TaskEntity taskEntity = taskService.getById(id);
        if (taskEntity.getUserId().intValue() != getUserId().intValue()) {
            throw new LoginException("非法操作");
        }
        return taskService.completeTask(id);
    }

    /**
     * 查询所有的工单状态列表
     *
     * @return
     */
    @GetMapping("/allTaskStatus")
    public List<TaskStatusTypeEntity> allTaskStatus() {
        return taskstatustypeService.allTaskStatus();
    }

    /**
     * 获取工单详情
     *
     * @param taskId
     * @return
     */
    @GetMapping("/taskInfo/{taskId}")
    public TaskEntity taskInfo(@PathVariable("taskId") Long taskId) {
        return taskService.taskInfo(taskId);
    }
}